package hu.comicsans;

import java.util.ArrayList;
import java.util.Random;

/**
 * A játéktérben felbukkanó statikus, helyüket nem változtató objektumok kezelése.
 * A játék kezdetekor elhelyzi a pályán az akadályokat (tócsa, kavics).
 * A pályára helyezi a hangyabolyt és a hangyalesőket. Számontartja az élelmiszerraktárak
 * állapotát, ha mind kiürült jelzi a játék végét.
 */
public class Palya implements Frissitheto {

	/**
	 * a hangyaboly a pálya egyik felén
	 */
	public HangyaBoly hangyaBoly;
	
	/**
	 * a raktárakat tartalmazó lista
	 */
	public ArrayList<ElelmiszerRaktar> elelmiszerRaktarLista;

	/**
	 * a hangyászsün, ami időnként feltűnik
	 */
	public HangyaszSun hangyaszSun;

	/**
	 * a tócsákat tartalmazó lista
	 */
	public ArrayList<Tocsa> tocsaLista;
	
	/**
	 * a kavicsokat tartalmazó lista
	 */
	public ArrayList<Kavics> kavicsLista;
	
	/**
	 * a hangyalesőket tartalmazó lista
	 */
	public ArrayList<HangyaLeso> hangyaLesoLista;
	
	/**
	 * egy véletlenszám generátor
	 */
	private Random generator = new Random();
	
	/**
	 * egy referencia a játékra, aminek ez a pályája
	 */
	private Jatek enJatekom;
	
	/**
	 * új pálya létrehozása
	 * @param jatek egy referencia a játékra, aki létrehozta
	 */
	public Palya(Jatek jatek) {
		
		enJatekom = jatek;
		
		elelmiszerRaktarLista = new ArrayList<ElelmiszerRaktar>();
		tocsaLista = new ArrayList<Tocsa>();
		kavicsLista = new ArrayList<Kavics>();
		hangyaLesoLista = new ArrayList<HangyaLeso>();
		
		//a sün kezdetben nem létezik
		hangyaszSun = null;
		
		//a pálya szélességét a játékban tároljuk
		int szelesseg = Jatek.szelesseg;
		
		//a pálya magasságát a játékban tároljuk
		int magassag = Jatek.magassag;
		
		hangyaBoly = new HangyaBoly(this, generator.nextDouble()*(szelesseg-10), generator.nextDouble()*(magassag-10), 10);
		
		//három raktár van
		
		elelmiszerRaktarLista.add(new ElelmiszerRaktar(generator.nextDouble()*szelesseg, generator.nextDouble()*(magassag-10), 10));
		elelmiszerRaktarLista.add(new ElelmiszerRaktar(generator.nextDouble()*szelesseg, generator.nextDouble()*(magassag-10), 10));
		elelmiszerRaktarLista.add(new ElelmiszerRaktar(generator.nextDouble()*szelesseg, generator.nextDouble()*(magassag-10), 10));
		
		//létrehozunk 10 tócsát
		
		for (int i = 0; i < 10; i++) {
			tocsaLista.add(new Tocsa(generator.nextDouble()*(szelesseg-10), generator.nextDouble()*(magassag-10), 10));
		}
		
		//létrehozunk 10 kavicsot
		
		for (int i = 0; i < 10; i++) {
			kavicsLista.add(new Kavics(generator.nextDouble()*(szelesseg-10), generator.nextDouble()*(magassag-10), 10));
		}
		
		//létrehozunk 10 hangyalesőt
		
		for (int i = 0; i < 10; i++) {
			hangyaLesoLista.add(new HangyaLeso(generator.nextDouble()*(szelesseg-10), generator.nextDouble()*(magassag-10), 10));
		}
	}

	/**
	 * Frissíti a pálya objektumait.
	 */
	@Override
	public void frissit(long elteltIdo) {

		//ha létezik hangyaboly
		if (hangyaBoly != null)
		{
			hangyaBoly.frissit(elteltIdo);
		}
		
		//ha épp van hangyászsün
		if (hangyaszSun != null)
		{
			hangyaszSun.frissit(elteltIdo);
		} else
		if (generator.nextInt(1000) > 997)
		{
			//kis valószínűséggel generálunk egyet
			hangyaszSun = new HangyaszSun(this, -20, generator.nextInt(100)+200, 1, 0.5-generator.nextDouble());
		}
		
		if (enJatekom.hangyaIrtoSpray != null)
		{
			enJatekom.hangyaIrtoSpray.frissit(elteltIdo);
		}
		
		for	(int i=0; i< kavicsLista.size(); i++)
		{
			kavicsLista.get(i).frissit(elteltIdo);
		}

	}

	/**
	 * Leellenőrzi az összes élelmiszerraktárra, hogy azok kiürültek-e.
	 * 
	 * @return igaz, ha minden raktár kiürült
	 */
	public Boolean mindenRaktarKiurult() {
		for (int i= 0; i< elelmiszerRaktarLista.size(); i++) {
			if (!elelmiszerRaktarLista.get(i).kiUrult()) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Minden statikus pozíciójú objektumra meghívjuk az ütközést kezelő függvényét.
	 * Ezen kívül ellenőrzünk szagnyom, sün és hangyabollya való ütközést is.
	 */
	public void utkozesekKezelese() {
		
		for	(int i=0; i< kavicsLista.size(); i++)
		{
			kavicsLista.get(i).utkozesKezelese(kavicsLista);
		}

		if (hangyaszSun != null && hangyaBoly != null)
		{
			hangyaBoly.hangyaEsSunUtkozesKezelese(hangyaszSun);
		}
		
		if (hangyaBoly != null)
		{
			hangyaBoly.hangyaEsBolyUtkozesKezelese();
		
			for	(int i=0; i< kavicsLista.size(); i++)
			{
				Kavics kavics = kavicsLista.get(i);
				hangyaBoly.hangyaEsKavicsUtkozesKezelese(kavics);
			}
			
			for	(int i=0; i< tocsaLista.size(); i++)
			{
				Tocsa tocsa = tocsaLista.get(i);
				hangyaBoly.hangyaEsTocsaUtkozesKezelese(tocsa);
			}
			
			for	(int i=0; i< elelmiszerRaktarLista.size(); i++)
			{
				ElelmiszerRaktar raktar = elelmiszerRaktarLista.get(i);
				hangyaBoly.hangyaEsRaktarUtkozesKezelese(raktar);
			}
			
			for	(int i=0; i< hangyaLesoLista.size(); i++)
			{
				HangyaLeso hl = hangyaLesoLista.get(i);
				hangyaBoly.hangyaEsHangyaLesoUtkozesKezelese(hl);
			}
		}		
		
		if (hangyaszSun != null)
		{
			for	(int i=0; i< kavicsLista.size(); i++)
			{
				Kavics kavics = kavicsLista.get(i);
				hangyaszSun.utkozesKezelese(kavics);
			}
		}
		
		if (enJatekom.hangyaIrtoSpray != null && hangyaBoly != null)
		{
			
			for (int i=0; i< enJatekom.hangyaIrtoSpray.mergezettTeruletLista.size(); i++)
			{
				MergezettTerulet mt = enJatekom.hangyaIrtoSpray.mergezettTeruletLista.get(i);
				hangyaBoly.hangyaEsMeregUtkozesekKezelese(mt);
			}
		}
	}

	/**
	 * A szagtalanító spray fújása egy megadott pozíción.
	 * 
	 * @param posX A fújás X koordinátája.
	 * @param posY A fújás Y koordinátája.
	 */
	public void szagtalanitoFujas(double posX, double posY) {
		if (enJatekom.szagtalanitoSpray != null)
		{
			enJatekom.szagtalanitoSpray.fuj(posX, posY);
		}
		
	}

	public void hangyaIrtoFujas(double posX, double posY) {
		if (enJatekom.hangyaIrtoSpray != null)
		{
			enJatekom.hangyaIrtoSpray.fuj(posX, posY);
		}
		
	}
}
